home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / tasktricks.r < prev    next >
Text File  |  1995-04-15  |  16KB  |  926 lines

  1.  
  2. ;---;  tasktricks.r  ;-------------------------------------------------------------
  3. *
  4. *    ****    SOME NIFTY LITTLE ROUTINES FOR TASKS    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Add. Code    Daniel Weber
  8. *    Version        1.16
  9. *    Last Revision    13.06.93
  10. *    Identifier    ttr_defined
  11. *    Prefix        ttr_    (task tricks)
  12. *                 ¯    ¯¯
  13. *    Macros        GetTaskPCPtr_, Forbid_, Permit_, Disable_, Enable_
  14. *            Supervisor_, GetCCR_, GetSR_, FindTask_, FindName_
  15. *            GetVBR_, User_, ClearCaches_, PrevState_
  16. *            DoRaw_, DoRawCnt_, InitList_, RestoreTDID_, SpaceKiller_,
  17. *            NoReq_, SetReq_, RestoreReq_
  18. *
  19. ;------------------------------------------------------------------------------
  20.  
  21. ;------------------
  22.     ifnd    ttr_defined
  23. ttr_defined    =1
  24.  
  25. ;------------------
  26. ttr_oldbase    equ __base
  27.     base    ttr_base
  28. ttr_base:
  29.  
  30. ;------------------
  31.  
  32. ;------------------------------------------------------------------------------
  33. *
  34. * GetTaskPCPtr_    Get address of PC in the stack of a task which is
  35. *        ready or waiting, concidering FPU frames on stack.
  36. *        If attempted on thistask, 0 is returned.
  37. *
  38. * INPUT:    a0    Task address
  39. *
  40. * RESULT:    a0    Pointer to address where PC is stored or 0.
  41. *
  42. * NOTE:        a0+0.l        =PC        a0+4.w        =SR
  43. *        a0+6+n*4.l    =Dn        a0+38+n*4.l    =An (exc. a7)
  44. *
  45. ;------------------------------------------------------------------------------
  46.  
  47. ;------------------
  48. ; Macro
  49. ;
  50. GetTaskPCPtr_    macro
  51.     ifd    ttr_GetTaskPCPtr
  52.         bsr    ttr_GetTaskPCPtr
  53.     else
  54.         pea    .ttr_end1(pc)
  55.  
  56. ;------------------
  57. ; Check for presence of FPU.
  58. ;
  59. ttr_GetTaskPCPtr    =    *
  60.     movem.l    d0/a6,-(sp)
  61.     move.l    4.w,a6
  62.     cmp.l    $114(a6),a0
  63.     beq.s    .ttr_task1
  64.     move.l    54(a0),a0    ;SP
  65.     btst    #4,297(a6)    ;FPU 81/82?
  66.     beq.s    .ttr_exit1
  67.  
  68.  
  69. ;------------------
  70. ; FPU present, check frame size.
  71. ;
  72. .ttr_fpu1:
  73.     move.b    (a0),d0
  74.     beq.s    .ttr_nos1
  75.  
  76.     lea    (2+4*3+12*8)(a0),a0
  77.     cmp.b    #$90,d0
  78.     bne.s    .ttr_nos1
  79.     lea    4*3+2(a0),a0
  80.  
  81. .ttr_nos1:
  82.     moveq    #4,d0            ;frame size for NULL frame
  83.     tst.b    (a0)
  84.     beq.s    .ttr_gotit1
  85.     move.b    1(a0),d0        ;fpu frame size
  86.  
  87. .ttr_gotit1:
  88.     add.w    d0,a0
  89.  
  90.  
  91.  
  92. ;------------------
  93. ; Got pointer and go.
  94. ;
  95. .ttr_exit1:
  96.     movem.l    (sp)+,d0/a6
  97.     rts
  98.  
  99. .ttr_task1:
  100.     suba.l    a0,a0
  101.     bra.s    .ttr_exit1
  102.  
  103. ;------------------
  104. ; End of macro.
  105. ;
  106. .ttr_end1:
  107.     endif
  108.     endm
  109.  
  110. ;------------------
  111.  
  112. ;------------------------------------------------------------------------------
  113. *
  114. * Forbid_    Call Forbid(). No registers changed.
  115. *
  116. ;------------------------------------------------------------------------------
  117.  
  118. ;------------------
  119. ; Macro
  120. ;
  121. Forbid_        macro
  122.     ifd    ttr_Forbid
  123.         bsr    ttr_Forbid
  124.     else
  125.         pea    .ttr_end2(pc)
  126.  
  127. ;------------------
  128. ; Forbid().
  129. ;
  130. ttr_Forbid    =    *
  131.     move.l    a6,-(sp)
  132.     move.l    4.w,a6
  133.     jsr    -132(a6)        ;Forbid()
  134.     move.l    (sp)+,a6
  135.     rts
  136.  
  137. ;------------------
  138. ; End of macro.
  139. ;
  140. .ttr_end2:
  141.     endif
  142.     endm
  143.  
  144. ;------------------
  145.  
  146. ;------------------------------------------------------------------------------
  147. *
  148. * Permit_    Call Permit(). No registers changed.
  149. *
  150. ;------------------------------------------------------------------------------
  151.  
  152. ;------------------
  153. ; Macro
  154. ;
  155. Permit_        macro
  156.     ifd    ttr_Permit
  157.         bsr    ttr_Permit
  158.     else
  159.         pea    .ttr_end3(pc)
  160.  
  161. ;------------------
  162. ; Permit().
  163. ;
  164. ttr_Permit    =    *
  165.     move.l    a6,-(sp)
  166.     move.l    4.w,a6
  167.     jsr    -138(a6)        ;Permit()
  168.     move.l    (sp)+,a6
  169.     rts
  170.  
  171. ;------------------
  172. ; End of macro.
  173. ;
  174. .ttr_end3:
  175.     endif
  176.     endm
  177.  
  178. ;------------------
  179.  
  180. ;------------------------------------------------------------------------------
  181. *
  182. * Disable_    Call Disable(). No registers changed.
  183. *
  184. ;------------------------------------------------------------------------------
  185.  
  186. ;------------------
  187. ; Macro
  188. ;
  189. Disable_    macro
  190.     ifd    ttr_Disable
  191.         bsr    ttr_Disable
  192.     else
  193.         pea    .ttr_end4(pc)
  194.  
  195. ;------------------
  196. ; Disable().
  197. ;
  198. ttr_Disable    =    *
  199.     move.l    a6,-(sp)
  200.     move.l    4.w,a6
  201.     jsr    -120(a6)        ;Disable()
  202.     move.l    (sp)+,a6
  203.     rts
  204.  
  205. ;------------------
  206. ; End of macro.
  207. ;
  208. .ttr_end4:
  209.     endif
  210.     endm
  211.  
  212. ;------------------
  213.  
  214. ;------------------------------------------------------------------------------
  215. *
  216. * Enable_    Call Enable(). No registers changed.
  217. *
  218. ;------------------------------------------------------------------------------
  219.  
  220. ;------------------
  221. ; Macro
  222. ;
  223. Enable_        macro
  224.     ifd    ttr_Enable
  225.         bsr    ttr_Enable
  226.     else
  227.         pea    .ttr_end5(pc)
  228.  
  229. ;------------------
  230. ; Enable().
  231. ;
  232. ttr_Enable    =    *
  233.     move.l    a6,-(sp)
  234.     move.l    4.w,a6
  235.     jsr    -126(a6)        ;Enable()
  236.     move.l    (sp)+,a6
  237.     rts
  238.  
  239. ;------------------
  240. ; End of macro.
  241. ;
  242. .ttr_end5:
  243.     endif
  244.     endm
  245.  
  246. ;------------------
  247.  
  248. ;------------------------------------------------------------------------------
  249. *
  250. * RestoreTDID_    Do Enable() and Permit() to go back to initial state.
  251. *
  252. ;------------------------------------------------------------------------------
  253.  
  254. ;------------------
  255. ; Macro
  256. ;
  257. RestoreTDID_        macro
  258.     ifd    ttr_RestoreTDID
  259.         bsr    ttr_RestoreTDId
  260.     else
  261.         pea    .ttr_end15(pc)
  262.  
  263. ;------------------
  264. ; Enable().
  265. ;
  266. ttr_RestoreTDID    =    *
  267.     move.l    a6,-(sp)
  268.     move.l    4.w,a6
  269.     jsr    -120(a6)        ;Disable()
  270.     jsr    -132(a6)        ;Forbid()
  271.     clr.w    294(a6)
  272.     jsr    -138(a6)        ;Permit()
  273.     jsr    -126(a6)        ;Enable()
  274.     move.l    (sp)+,a6
  275.     rts
  276.  
  277. ;------------------
  278. ; End of macro.
  279. ;
  280. .ttr_end15:
  281.     endif
  282.     endm
  283.  
  284. ;------------------
  285.  
  286. ;------------------------------------------------------------------------------
  287. *
  288. * SupervisorMode_    Enter supervisor mode in the old exec manner
  289. *
  290. * a5:            routine
  291. *
  292. ;------------------------------------------------------------------------------
  293. SupervisorMode_    MACRO
  294.         IFD    ttr_SupervisorMode
  295.         bsr    ttr_SupervisorMode
  296.         ELSE
  297.         pea    .ttr_SupervisorModeEnd(pc)
  298. ttr_SupervisorMode    EQU    *
  299.         movem.l    a5/a6,-(a7)
  300.         move.l    4.w,a6
  301.         jsr    -30(a6)
  302.         movem.l    (a7)+,a5/a6
  303.         rts
  304. .ttr_SupervisorModeEnd:
  305.         ENDC
  306.         ENDM
  307.  
  308.  
  309. ;------------------------------------------------------------------------------
  310. *
  311. * Supervisor_    Enter supervisor mode with supervisor stack. No regs changed.
  312. *        In case of a 68020+, the ISP is used, no matter what the
  313. *        M bit says.
  314. *
  315. * RESULT:    d0    Old SR. CCR is not guaranteed by Exec.
  316. *
  317. ;------------------------------------------------------------------------------
  318.  
  319. ;------------------
  320. ; Macro
  321. ;
  322. Supervisor_    macro
  323.     ifd    ttr_Supervisor
  324.         bsr    ttr_Supervisor
  325.     else
  326.         pea    .ttr_end6(pc)
  327.  
  328. ;------------------
  329. ; Clean up old stack
  330. ;
  331. ttr_Supervisor    =    *
  332.     pea    (a6)            ;    v    v
  333.     lea    .ttr_regs6(pc),a6    
  334.     movem.l    a4/a5,(a6)
  335.     movea.l    (sp)+,a4
  336.     movem.l    a4,8(a6)        ;ALL THIS DOES NOT CHANGE CCR
  337.     move.l    (sp)+,a4        ;where to go
  338.     movea.l    4.w,a6
  339.     lea    .ttr_super6(pc),a5    ;    ^    ^
  340.     jmp    -30(a6)            ;Supervisor()
  341.  
  342. ;------------------
  343. ; Supervisor routine.
  344. .ttr_super6:
  345.     move.l    a4,2(a7)
  346.     move.w    (a7),d0
  347.     move.w    #$2000,(a7)
  348.     movem.l    .ttr_regs6(pc),a4-a6
  349.     rte
  350.  
  351. .ttr_regs6:
  352.     dc.l    0,0,0
  353.  
  354. ;------------------
  355. ; End of macro.
  356. ;
  357. .ttr_end6:
  358.     endif
  359.     endm
  360.  
  361. ;------------------
  362.  
  363. ;------------------------------------------------------------------------------
  364. *
  365. * User_        Return to user state.
  366. *
  367. ;------------------------------------------------------------------------------
  368.  
  369. ;------------------
  370. ; Macro
  371. ;
  372. User_    macro
  373.     andi.w    #$dfff,sr
  374.     endm
  375.  
  376. ;------------------
  377.  
  378. ;------------------------------------------------------------------------------
  379. *
  380. * PrevState_    Return to previous state.
  381. *
  382. * INPUT:    d0    Old SR register.
  383. *
  384. ;------------------------------------------------------------------------------
  385.  
  386. ;------------------
  387. ; Macro
  388. ;
  389. PrevState_    macro
  390.     move.w    d0,sr
  391.     endm
  392.  
  393. ;------------------
  394.  
  395. ;------------------------------------------------------------------------------
  396. *
  397. * GetSR_    Gets entier SR. If the CCR would be guaranteed for Supervisor()
  398. *        This routine could get a lot easier. No regs changed.
  399. *
  400. * RESULT:    d0    SR
  401. *
  402. ;------------------------------------------------------------------------------
  403.  
  404. ;------------------
  405. ; Macro
  406. ;
  407. GetSR_        macro
  408.     ifd    ttr_GetSR
  409.         bsr    ttr_GetSR
  410.     else
  411.         pea    .ttr_end7(pc)
  412.  
  413. ;------------------
  414. ; Get CCR, call supervisor and merge regs.
  415. ;
  416. ttr_GetSR    =    *
  417.     GetCCR_
  418.     andi.w    #$ff,d0        ;mask out CCR
  419.     move.w    d0,-(sp)    
  420.     Supervisor_
  421.     clr.b    d0        ;mask out SR
  422.     move.w    d0,sr
  423.     or.w    (sp)+,d0    ;=>SR
  424.     rts
  425.  
  426. ;------------------
  427. ; End of macro.
  428. ;
  429. .ttr_end7:
  430.     endif
  431.     endm
  432.  
  433. ;------------------
  434.  
  435. ;------------------------------------------------------------------------------
  436. *
  437. * GetCCR_    Gets CCR the right way. No regs changed.
  438. *
  439. * RESULT:    d0    CCR
  440. *
  441. ;------------------------------------------------------------------------------
  442.  
  443. ;------------------
  444. ; Macro
  445. ;
  446. GetCCR_        macro
  447.     ifd    ttr_GetCCR
  448.         bsr    ttr_GetCCR
  449.     else
  450.         pea    .ttr_end8(pc)
  451.  
  452. ;------------------
  453. ; Jump to right routine.
  454. ;
  455. ttr_GetCCR    =    *
  456.     movem.l    d1-d4,-(sp)
  457.     scs    d1    ;C
  458.     svs    d2    ;V
  459.     seq    d3    ;Z
  460.     smi    d4    ;N
  461.     roxl.b    #1,d0    ;X
  462.     roxr.b    #1,d4
  463.     roxl.b    #1,d0
  464.     roxr.b    #1,d3
  465.     roxl.b    #1,d0
  466.     roxr.b    #1,d2
  467.     roxl.b    #1,d0
  468.     roxr.b    #1,d1
  469.     roxl.b    #1,d0
  470.     and.w    #$1f,d0
  471.     movem.l    (sp)+,d1-d4
  472.     rts
  473.  
  474. ;------------------
  475. ; End of macro.
  476. ;
  477. .ttr_end8:
  478.     endif
  479.     endm
  480.  
  481. ;------------------
  482.  
  483. ;------------------------------------------------------------------------------
  484. *
  485. * FindTask_    Find task structure with Forbid()/Permit().
  486. *
  487. * INPUT:    a1    Name
  488. *
  489. * RESULT:    d0    Struct or 0
  490. *
  491. ;------------------------------------------------------------------------------
  492.  
  493. ;------------------
  494. ; Macro
  495. ;
  496. FindTask_        macro
  497.     ifd    ttr_FindTask
  498.         bsr    ttr_FindTask
  499.     else
  500.         pea    .ttr_end9(pc)
  501.  
  502. ;------------------
  503. ; Jump to right routine.
  504. ;
  505. ttr_FindTask    =    *
  506.     movem.l    d1-a6,-(sp)
  507.     Forbid_
  508.     move.l    4.w,a6
  509.     jsr    -294(a6)        ;FindTask()
  510.     Permit_
  511.     movem.l    (sp)+,d1-a6
  512.     rts    
  513.  
  514. ;------------------
  515. ; End of macro.
  516. ;
  517. .ttr_end9:
  518.     endif
  519.     endm
  520.     
  521. ;------------------
  522.  
  523. ;------------------------------------------------------------------------------
  524. *
  525. * FindName_    Find a node in a list, with Forbid()/Permit().
  526. *
  527. * INPUT:    a0    List
  528. *        a1    Name
  529. *
  530. * RESULT:    d0    Struct or 0
  531. *
  532. ;------------------------------------------------------------------------------
  533.  
  534. ;------------------
  535. ; Macro
  536. ;
  537. FindName_    macro
  538.     ifd    ttr_FindName
  539.         bsr    ttr_FindName
  540.     else
  541.         pea    .ttr_end10(pc)
  542.  
  543. ;------------------
  544. ; Jump to right routine.
  545. ;
  546. ttr_FindName    =    *
  547.     movem.l    d1-a6,-(sp)
  548.     Forbid_
  549.     move.l    4.w,a6
  550.     jsr    -276(a6)        ;FindName()
  551.     Permit_
  552.     movem.l    (sp)+,d1-a6
  553.     rts    
  554.  
  555. ;------------------
  556. ; End of macro.
  557. ;
  558. .ttr_end10:
  559.     endif
  560.     endm
  561.  
  562. ;------------------
  563.  
  564. ;------------------------------------------------------------------------------
  565. *
  566. * GetVBR_    Get the VBR register for 68010+. Returns 0 for 68000.
  567. *
  568. * RESULT:    d0    VBR or 0 for 68000.
  569. *
  570. ;------------------------------------------------------------------------------
  571.  
  572. ;------------------
  573. ; Macro
  574. ;
  575. GetVBR_    macro
  576.     ifd    ttr_GetVBR
  577.         bsr    ttr_GetVBR
  578.     else
  579.         pea    .ttr_end11(pc)
  580.  
  581. ;------------------
  582. ; Jump to right routine.
  583. ;
  584. ttr_GetVBR    =    *
  585.     movem.l    d1/a6,-(sp)
  586.     moveq    #0,d0
  587.     movea.l    4.w,a6
  588.     btst    #0,296+1(a6)        ;ATTN flags
  589.     beq.s    .ttr_GetVBRend
  590.  
  591.     Supervisor_
  592.     dc.w    $4e7a,$1801        ;movec    vbr,d1
  593.     PrevState_            ;return to previous mode
  594.     move.l    d1,d0
  595.  
  596. .ttr_GetVBRend:
  597.     movem.l    (sp)+,d1/a6
  598.     rts
  599.     
  600. ;------------------
  601. ; End of macro.
  602. ;
  603. .ttr_end11:
  604.     endif
  605.     endm
  606.  
  607. ;------------------
  608.  
  609. ;------------------------------------------------------------------------------
  610. *
  611. * ClearCaches_    Clear all caches. Does nothing for 68000/10.
  612. *
  613. ;------------------------------------------------------------------------------
  614.  
  615. ;------------------
  616. ; Macro
  617. ;
  618. ClearCaches_    macro
  619.     ifd    ttr_ClearCaches
  620.         bsr    ttr_ClearCaches
  621.     else
  622.         pea    .ttr_end12(pc)
  623.  
  624. ;------------------
  625. ; Jump to right routine.
  626. ;
  627. ttr_ClearCaches    =    *
  628.     movem.l    d0-d2/a0-a1/a6,-(sp)
  629.     movea.l    4.w,a6
  630.  
  631.     IFND    cws_V36PLUSONLY
  632.     btst    #1,296+1(a6)        ;ATTN flags
  633.     beq.s    .ttr_ClearCachesend    ;68000/10 => don't do
  634.     cmp.w    #36,20(a6)        ;2.0 or better?
  635.     bhs.s    .ttr_ClearCachesExec
  636.  
  637.     Supervisor_
  638.     dc.w    $4e7a,$1002        ;movec    cacr,d1
  639.     move.w    #$8000,d2
  640.     dc.w    $4e7b,$2002        ;movec    d2,cacr
  641.     dc.w    $4e7a,$2002        ;movec    cacr,d2
  642.     tst.w    d2
  643.     bmi.s    .ttr_CacheClearforty
  644.     or.w    #$808,d1        ;data and instruction cache clear
  645.     bra.s    .ttr_ClearCachesdone
  646.  
  647. .ttr_CacheClearforty:
  648.     dc.w    $f4f8            ;cpusha
  649.  
  650. .ttr_ClearCachesdone:
  651.     dc.w    $4e7b,$1002        ;movec    d1,cacr
  652.     PrevState_
  653.     bra.s    .ttr_ClearCachesend    
  654.     ENDIF
  655.  
  656. .ttr_ClearCachesExec:
  657.     jsr    -636(a6)        ;CacheClearU()
  658.  
  659. .ttr_ClearCachesend:
  660.     movem.l    (sp)+,d0-d2/a0-a1/a6
  661.     rts
  662.     
  663. ;------------------
  664. ; End of macro.
  665. ;
  666. .ttr_end12:
  667.     endif
  668.     endm
  669.  
  670. ;------------------
  671.  
  672. ;------------------------------------------------------------------------------
  673. *
  674. * DoRaw_    Call RawDoFmt.
  675. *
  676. *    a0:    format string
  677. *    a1:    data
  678. *    a3:    buffer
  679. *
  680. ;------------------------------------------------------------------------------
  681.  
  682. ;------------------
  683. ; Macro
  684. ;
  685. DoRaw_    macro
  686.     ifd    ttr_DoRaw
  687.         bsr    ttr_DoRaw
  688.     else
  689.         pea    .ttr_end13(pc)
  690.  
  691. ;------------------
  692. ; Jump to right routine.
  693. ;
  694. ttr_DoRaw    =    *
  695.     movem.l    d0-d3/a0-a3/a6,-(sp)
  696.     movea.l    4.w,a6
  697.     lea    .setin(pc),a2
  698.     jsr    -522(a6)        ;RawDOFmt()
  699.     movem.l    (sp)+,d0-d3/a0-a3/a6
  700.     rts
  701.  
  702. .setin:    move.b    d0,(a3)+
  703.     rts
  704.  
  705. ;------------------
  706. ; End of macro.
  707. ;
  708. .ttr_end13:
  709.     endif
  710.     endm
  711.  
  712. ;------------------
  713.  
  714. ;------------------------------------------------------------------------------
  715. *
  716. * DoRawCnt_    Count number of bytes used for the result string of DoRaw_.
  717. *
  718. *    a0:    format string
  719. *    a1:    data
  720. *
  721. ;------------------------------------------------------------------------------
  722.  
  723. ;------------------
  724. ; Macro
  725. ;
  726. DoRawCnt_    macro
  727.     ifd    ttr_DoRawCnt
  728.         bsr    ttr_DoRawCnt
  729.     else
  730.         pea    .ttr_end132(pc)
  731.  
  732. ;------------------
  733. ; Jump to right routine.
  734. ;
  735. ttr_DoRawCnt    =    *
  736.     movem.l    d1-d3/a0-a3/a6,-(sp)
  737.     lea    .counter(pc),a3
  738.     clr.l    (a3)
  739.     movea.l    4.w,a6
  740.     lea    .setin2(pc),a2
  741.     jsr    -522(a6)        ;RawDOFmt()
  742.     move.l    .counter(pc),d0
  743.     movem.l    (sp)+,d1-d3/a0-a3/a6
  744.     rts
  745.  
  746. .setin2:addq.l    #1,(a3)
  747.     rts
  748.  
  749. .counter:
  750.     dc.l    0
  751.  
  752. ;------------------
  753. ; End of macro.
  754. ;
  755. .ttr_end132:
  756.     endif
  757.     endm
  758.  
  759. ;------------------
  760.  
  761. ;------------------------------------------------------------------------------
  762. *
  763. * InitList_    Init a list.
  764. *
  765. * USAGE:    InitList_        Init list at a0.
  766. *        InitList_ (MyList)    Init MyList.
  767. *
  768. ;------------------------------------------------------------------------------
  769.  
  770. ;------------------
  771. ; Macro
  772. ;
  773. InitList_    macro
  774.     IFNC    '\1',''
  775.     lea    \1(pc),a0
  776.     ENDIF
  777.     ifd    ttr_InitList
  778.         bsr    ttr_InitList
  779.     else
  780.         pea    .ttr_end14(pc)
  781.  
  782. ;------------------
  783. ; Jump to right routine.
  784. ;
  785. ttr_InitList    =    *
  786.     pea    4(a0)
  787.     move.l    (sp)+,(a0)
  788.     clr.l    4(a0)
  789.     move.l    a0,8(a0)
  790.     rts
  791.  
  792. ;------------------
  793. ; End of macro.
  794. ;
  795. .ttr_end14:
  796.     endif
  797.     endm
  798.  
  799.  
  800. ;------------------
  801.  
  802. ;------------------------------------------------------------------------------
  803. *
  804. * SpaceKiller_    Standard space killer function for A0.
  805. *
  806. * USAGE:    SpaceKiller_
  807. *
  808. ;------------------------------------------------------------------------------
  809.  
  810. ;------------------
  811. ; Macro
  812. ;
  813. SpaceKiller_    macro
  814.     ifd    ttr_SpaceKiller
  815.         bsr    ttr_SpaceKiller
  816.     else
  817.         pea    .ttr_end16(pc)
  818.  
  819. ;------------------
  820. ; Jump to right routine.
  821. ;
  822. ttr_SpaceKiller    =    *
  823.     cmp.b    #" ",(a0)+
  824.     beq.s    ttr_SpaceKiller
  825.     subq.l    #1,a0
  826.     rts
  827.  
  828. ;------------------
  829. ; End of macro.
  830. ;
  831. .ttr_end16:
  832.     endif
  833.     endm
  834.  
  835. ;------------------
  836.  
  837.  
  838. ;------------------------------------------------------------------------------
  839. *
  840. * NoReq_    disable requesters, be 'quietly'
  841. * SetReq_    set pr_WindowPtr field
  842. * ResetReq_    set pr_WindowPtr field (SetReq_ = ResetReq_)
  843. *
  844. * NoReq_ returns old WindowPtr in d0.
  845. *
  846. * SetReq_ and ResetReq_ expect a value (for pr_WindowPtr) in d0.
  847. *
  848. ;------------------------------------------------------------------------------
  849.  
  850. ;------------------
  851. *
  852. * NoReq_
  853. *
  854. NoReq_    MACRO
  855.     IFD    ttr_NoReq
  856.         bsr    ttr_NoReq
  857.     ELSE
  858.         pea    .ttr_NoReqEnd(pc)
  859.  
  860. ;------------------
  861. ; NoReq().
  862. ttr_NoReq    EQU    *
  863.     movem.l    d1/a1,-(a7)
  864.     move.l    4.w,a1
  865.     move.l    $114(a1),a1        ; ThisTask
  866.     move.l    $b8(a1),d0        ; pr_WindowPtr
  867.     moveq    #-1,d1
  868.     move.l    d1,$b8(a1)        ; pr_WindowPtr
  869.     movem.l    (a7)+,d1/a1
  870.     rts
  871. .ttr_NoReqEnd:
  872.     ENDC
  873.     ENDM
  874.  
  875.  
  876.  
  877.  
  878.  
  879. ;------------------
  880. *
  881. * SetReq_
  882. *
  883. SetReq_    MACRO
  884.     IFD    ttr_SetReq
  885.         bsr    ttr_SetReq
  886.     ELSE
  887.         pea    .ttr_SetReqEnd(pc)
  888.  
  889. ;------------------
  890. ; SetReq().
  891. ttr_SetReq    EQU    *
  892.     move.l    a1,-(a7)
  893.     move.l    4.w,a1
  894.     move.l    $114(a1),a1        ; ThisTask
  895.     move.l    d0,$b8(a1)        ; pr_WindowPtr
  896.     move.l    (a7)+,a1
  897.     rts
  898. .ttr_SetReqEnd:
  899.     ENDC
  900.     ENDM
  901.  
  902.  
  903.  
  904. ;------------------
  905. *
  906. * RestoreReq_
  907. *
  908. RestoreReq_    MACRO
  909.     SetReq_
  910.     ENDM
  911.  
  912.  
  913.  
  914.  
  915. ;--------------------------------------------------------------------
  916.  
  917. ;------------------
  918.     base    ttr_oldbase
  919.  
  920. ;------------------
  921.     endif
  922.  
  923.     end
  924.  
  925.